// 版权归GoFrame作者(https://goframe.org)所有。保留所有权利。
//
// 本源代码形式受MIT许可证条款约束。
// 如果未随本文件一同分发MIT许可证副本，
// 您可以在https://github.com/gogf/gf处获取。
// md5:a9832f33b234e3f3

package 进程类

import (
	"io"

	gerror "gitee.com/go_888/goframe/errors/gerror"
	"gitee.com/go_888/goframe/internal/json"
	gtcp "gitee.com/go_888/goframe/net/gtcp"
)

// X发送数据 向给定pid的指定进程发送数据。 md5:32fd0c7aeb3b969c
func X发送数据(进程ID int, 数据 []byte, 可选组 ...string) error {
	msg := X结构_MsgRequest{
		X发送方进程ID: X取自进程ID(),
		X接收人进程ID: 进程ID,
		X消息组名称:   defaultGroupNameForProcComm,
		X响应数据:    数据,
	}
	if len(可选组) > 0 {
		msg.X消息组名称 = 可选组[0]
	}
	msgBytes, err := json.Marshal(msg)
	if err != nil {
		return err
	}
	var conn *gtcp.X结构_PoolConn
	conn, err = getConnByPid(进程ID)
	if err != nil {
		return err
	}
	defer conn.Close()
	// Do the sending.
	var result []byte
	result, err = conn.SendRecvPkg(msgBytes, gtcp.X结构_PkgOption{
		Retry: gtcp.X结构_Retry{
			Count: 3,
		},
	})
	if len(result) > 0 {
		response := new(X结构_MsgResponse)
		if err = json.UnmarshalUseNumber(result, response); err == nil {
			if response.X响应状态码 != 1 {
				err = gerror.X创建(response.X响应消息)
			}
		}
	}
	// EOF并不是真正的错误。 md5:cb1e51e9bbca2b19
	if err == io.EOF {
		err = nil
	}
	return err
}
